"""
给定一个字符串 s ，请你找出其中不含有重复字符的最长子串的长度。

示例 1:
输入: s = "abcabcbb"
输出: 3
解释: 因为无重复字符的最长子串是 "abc"，所以其长度为 3。

示例 2:
输入: s = "bbbbb"
输出: 1
解释: 因为无重复字符的最长子串是 "b"，所以其长度为 1。

示例 3:
输入: s = "pwwkew"
输出: 3
解释: 因为无重复字符的最长子串是 "wke"，所以其长度为 3。
     请注意，你的答案必须是 子串 的长度，"pwke" 是一个子序列，不是子串。

提示：
s 由英文字母、数字、符号和空格组成
"""
import time
start = time.time()
time.sleep(1)
# s = "abcabcabceabcsbb"  # 最长子串 eabcs
# s = "abcabcbb"
# s = "bbbbb"
# s = "pwwkew"
s = "abcde"  # 最长子串等于本身时
si1 = ""  # 存储字符拼接结果
si2 = ""  # 存储最后结果
sc = 1  # 保持循环 使找到重复值后从索引sc再次开始找直至找完全部
i = 0  # 循环条件成立与否的变量
while i < len(s):
    if s[i] not in si1:  # 判断字符是否在si1里 即是否遇到重复字符
        si1 = si1+s[i]   # 结果为假 则将字符拼接在si1中
        i += 1  # 循环进度加1
        if len(si1) > len(si2):  # 判断si1的字符串是否比si2的长
            si2 = si1            # 结果为真 则将si1的字符串赋值给si2
    else:
        si1 = ""         # 结果为真 则将字符串si1清空
        i = sc           # 并使i等于sc 即将循环进度拉回到sc处开始
        sc += 1          # 将sc加一等待下次找到重复字符后使用并推进循环进度
print(f"字符串s的最长字串是:{si2}\n长度是:{len(si2)}")
end = time.time()
print(f"运行时间:{end-start}")

